home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
PROGRAMM
/
PASCAL
/
0920.ZIP
/
STRING.ARC
/
STRINGS.ASM
< prev
next >
Wrap
Assembly Source File
|
1987-12-26
|
23KB
|
508 lines
PAGE 55,132
CODE SEGMENT BYTE PUBLIC
ASSUME CS:CODE
PUBLIC UPPERCASE
PUBLIC STRINGOF
PUBLIC TRANSLATE
PUBLIC EXTRACTTOCHAR
PUBLIC EXTRACTFORCOUNT
PUBLIC PADLEFT
PUBLIC PADRIGHT
PAGE
;----------------------------------------------------------------------
; PROTOTYPE: STRING := UPPERCASE(STRING1);
;
; STRING === ANY VALID TP4 STRING VARIABLE
; STRING1 === ANY VALID TP4 STRING VARIABLE
;----------------------------------------------------------------------
; THE EFFECT OF THIS ROUTINE IS AS IF YOU HAD CODED THE FOLLOWING;
;
; FOR I := 1 TO LENGTH(STRING1) DO
; STRING[I] := UPCASE(STRING1[I]);
;
;---------------------------------------------------------------------
UCRESULT EQU DWORD PTR [BP+10] ;POS OF RESULT PTR IN STACK
UCSTRING EQU DWORD PTR [BP+6] ;POS OF STRING PTR IN STACK
UPPERCASE PROC FAR
PUSH BP ;SAVEBP
MOV BP,SP ;SETUP STACK FRAME
PUSH DS ;SAVE DATA SEGMENT POINTER
LDS SI,UCSTRING ;LOAD SOURCE ADDRESSES
LES DI,UCRESULT ;LOAD RESULT ADDRESSES
CLD ;SET DIRECTION TO FORWARD
LODSB ;MOVE THE STRING LENGTH
STOSB ;
;
; SETUP THE LENGTH IN CX AND MAKE SURE THERE IS SOMETHING TO DO
;
MOV CL,AL ;COPY STRING LENGTH TO CX
XOR CH,CH ;CLEAR HIGH ORDER WORD
JCXZ UCEXIT ;EXIT IF LENGTH = ZERO
;
; NOW WE LOOP CHECKING EACH BYTE AND WHERE NEEDED CONVERTING THE CASE
;
UCLOOP:
LODSB ;LOAD NEXT STRING CHARACTER
CMP AL,'a' ;Q. LESS THAN 'A'
JB UCSTORE ;A. YES--THEN WE DONT WANT IT
CMP AL,'z' ;Q. GREATER THAN 'Z'
JA UCSTORE ;A. YES--THEN WE DONT WANT IT
SUB AL,'a'-'A' ;A. NO--CHANGE IT TO UPPER CASE
UCSTORE:
STOSB ;STORE BYTE INTO RESULT STRING
LOOP UCLOOP ;GO PROCESS NEXT BYTE
;
; ALL DONE SO RESTORE THE STUFF WE SAVED AND RETURN TO CALLER
;
UCEXIT:
POP DS ;RESTORE DATA SEGMENT PTR
POP BP ;RESTORE BASE POINTER
RET 4 ;REMOVE PARAM AND RETURN
UPPERCASE ENDP
PAGE
;----------------------------------------------------------------------
; PROTOTYPE: STRING := STRINGOF(CHARACTER, LENGTH);
;
; STRING === ANY VALID TP4 STRING VARIABLE
; CHARACTER === ANY VALID CHARACTER
; LENGTH === THE NUMBER OF BYTES TO FILL WITH CHARACTER
;----------------------------------------------------------------------
; THE EFFECT OF THIS ROUTINE IS AS IF YOU HAD CODED THE FOLLOWING;
;
; FOR I := 1 TO LENGTH DO
; STRING[I] := CHARACTER;
;
; IT IS THE USERS RESPONSIBILITY TO INSURE THAT THE STRING IS LARGE
; ENOUGH TO CONTAIN 'LENGTH' REPITIONS OF CHARACTER.
;---------------------------------------------------------------------
SORESULT EQU DWORD PTR [BP+10] ;STACK POS OF RESULT PTR
SOCHAR EQU BYTE PTR [BP+8] ;STACK POS OF FILL CHARACTER
SOCOUNT EQU BYTE PTR [BP+6] ;STACK POS OF FILL LENGTH
STRINGOF PROC FAR
PUSH BP ;SAVE BASE POINTER
MOV BP,SP ;SETUP STACK FRAME
;
; NOW PICK UP THE PARAMETERS AND MAKE SURE WE FILL AT LEAST 1 BYTE
;
LES DI,SORESULT ;LOAD ADDRESS OF RESULT
MOV AL,SOCOUNT ;LOAD LENGTH OF FILL
OR AL,AL ;Q. IS LENGTH ZERO
JZ SOEXIT ;A. YES--THEN NOTHING TO DO
CLD ;SET DIRECTION TO FORWARD
STOSB ;SET LENGTH OF RESULT
MOV CL,AL ;COPY LENGTH TO CX
XOR CH,CH ;CLEAR HIGH ORDER BYTE
MOV AL,SOCHAR ;LOAD THE FILL CHARACTER
REP STOSB ;FILL STRING WITH CHARACTER
;
; ALL DONE SO RESTORE THE STUFF WE SAVED AND RETURN TO THE CALLER
;
SOEXIT:
POP BP ;RESTORE BASE POINTER
RET 4 ;REMOVE AND RETURN
STRINGOF ENDP
PAGE
;----------------------------------------------------------------------
; PROTOTYPE: TRANSLATE(STRING_NAME,TRANSLATE_TABLE);
;
; STRING_NAME === THE NAME OF ANY VALID TP4 STRING VARIABLE
;
; TRANSLATE_TABLE === THE NAME OF A 256 BYTE TRANSLATION TABLE.
;----------------------------------------------------------------------
; THE EFFECT OF THIS ROUTINE IS AS IF YOU HAD CODED THE FOLLOWING;
;
; STRING[I] := TRANSLATE_TABLE[ORD(STRING[I])];
;
; IT IS THE USERS RESPONSIBILITY TO INSURE THAT THE TRANSLATE TABLE
; IS AT LEAST 256 BYTES IN LENGTH.
;---------------------------------------------------------------------
TSSTRING EQU DWORD PTR [BP+10] ;STACK POS OF RESULT PTR
TSTABLE EQU DWORD PTR [BP+6] ;STACK POS OF FILL LENGTH
TRANSLATE PROC FAR
PUSH BP ;SAVE BASE POINTER
MOV BP,SP ;SETUP STACK FRAME
PUSH DS ;SAVE DATA SEGMENT POINTER
;
; NOW PICK UP THE PARAMETERS AND MAKE SURE WE FILL AT LEAST 1 BYTE
;
LES DI,TSSTRING ;LOAD ADDR OF STRING
LDS BX,TSTABLE ;LOAD ADDR OF TRANSLATE TABLE
MOV SI,DI ;SET SOURCE = DESTINATION
;
; NOW GET THE STRING LENGTH AND MAKE SURE IT IS NOT ZERO
;
LODSB ;LOAD THE STRING LENGTH
MOV CL,AL ;COPY INTO CX AND
SUB CH,CH ;CLEAR HIGH ORDER BYTE
JCXZ TSEXIT ;Q. IS LENGTH ZERO
INC DI ;A. NO--MAKE DI MATCH SI
CLD ;SET DIRECTION TO FORWARD
;
; HERE IS THE MAIN TRANSLATION LOOP
;
TSLOOP:
LODSB ;LOAD A SOURCE BYTE
XLAT ;TRANSLATE THE BYTE
STOSB ;STORE BACK INTO STRING
LOOP TSLOOP ;GO PROCESS NEXT BYTE
;
; ALL DONE SO RESTORE THE STUFF WE SAVED AND RETURN TO THE CALLER
;
TSEXIT:
POP DS ;RESTORE DATA SEGMENT
POP BP ;RESTORE BASE POINTER
RET 8 ;REMOVE AND RETURN
TRANSLATE ENDP
PAGE
;----------------------------------------------------------------------
; TARGET := EXTRACTTOCHAR(SOURCE,SIZEOF(TARGET),BOUNDARY_CHAR);
;
; TARGET === THE NAME OF ANY VALID TP4 STRING VARIABLE
; SOURCE === THE NAME OF ANY VALID TP4 STRING VARIABLE
; SIZEOF(X) === THE VALUE RETURN BY SIZEOF FOR TAGET
; BOUNDARY_CHAR === ANY VALID CHARACTER
;----------------------------------------------------------------------
; IT IS THE USERS RESPONSIBILITY TO INSURE THAT THE TARGET STRING IS
; LARGE ENOUGH TO CONTAIN THE EXTRACTED STRING.
;---------------------------------------------------------------------
EXTARGET EQU DWORD PTR [BP+14] ;STACK POS OF RESULT PTR
EXSOURCE EQU DWORD PTR [BP+10] ;STACK POS OF RESULT PTR
EXTRGLEN EQU WORD PTR [BP+8] ;STACK POS OF RESULT LENGTH
EXCHAR EQU BYTE PTR [BP+6] ;STACK POS OF BOUNDARY CHAR
EXTRACTTOCHAR PROC FAR
PUSH BP ;SAVE BASE POINTER
MOV BP,SP ;SETUP STACK FRAME
PUSH DS ;SAVE DATA SEGMENT POINTER
;
; NOW PICK UP THE PARAMETERS AND MAKE SURE WE FILL AT LEAST 1 BYTE
;
LES DI,EXTARGET ;LOAD ADDR OF TARGET STRING
LDS SI,EXSOURCE ;LOAD ADDR OF SOURCE STRING
MOV AH,EXCHAR ;LOAD THE BOUNDARY CHARACTER
;
; SET THE SOURCE LENGTH TO ZERO IN CASE THERE IS NOTHING TO DO
;
SUB AL,AL ;CLEAR AL
STOSB ;SET TARGET LENGTH TO ZERO
;
; NOW GET THE STRING LENGTH AND MAKE SURE IT IS NOT ZERO
;
LODSB ;LOAD THE STRING LENGTH
MOV CL,AL ;COPY INTO CX AND
SUB CH,CH ;CLEAR HIGH ORDER BYTE
JCXZ EXEXIT ;Q. IS LENGTH ZERO
SUB BL,BL ;A. NO--CLEAR EXTRACTED LENGTH
MOV DX,EXTRGLEN ;LOAD MAXIMUM LENGTH OF TARGET
CLD ;SET DIRECTION TO FORWARD
;
; HERE IS THE MAIN TRANSLATION LOOP
;
EXLOOP:
LODSB ;LOAD A SOURCE BYTE
CMP AH,AL ;Q. IS IT THE BOUNDARY CHAR
JE EXBOUND ;A. YES--GO CLEAN UP THINGS
STOSB ;A. NO--STORE CHAR INTO TARGET
INC BL ;INCREMENT EXTRACTED CHAR COUNT
DEC DX ;Q. ANY ROOM LEFT IN TARGET
JZ EXBOUND ;A. NO--THEN STOP MOVING
LOOP EXLOOP ;GO PROCESS NEXT BYTE
;
; WE HAVE FOUND THE BOUNDARY CHARACTER SO SET THE TARGET LENGTH
; AND DELETE THE EXTRACTED CHARACTERS FROM THE SOURCE STRING
;
EXBOUND:
LES DI,EXTARGET ;RELOAD ADDR OF TARGET
MOV AL,BL ;COPY EXTRACTED LENGTH TO AL
STOSB ;SET TARGET STRING LENGTH
;
; NOW WE MUST REMOVE THE EXTRACTED CHARACTERS FROM THE SOURCE STRING
;
LES DI,EXSOURCE ;RELOAD ADDR OF SOURCE
LDS SI,EXSOURCE ;AND ONCE MORE FOR MOVE
LODSB ;AL = SOURCE STRING LENGTH
SUB BH,BH ;CLEAR HIGH ORDER BX
ADD SI,BX ;OFFSET TO BOUNDARY FOUND
SUB AL,BL ;LENGTH = LENGTH - EXTRACT_CNT
STOSB ;STORE NEW SOURCE LENGTH
MOV CL,AL ;SETUP TO MOVE REST OF SOURCE
SUB CH,CH ;
REP MOVSB ;LEFT ALIGN REMAINING SOURCE
;
; ALL DONE SO RESTORE THE STUFF WE SAVED AND RETURN TO THE CALLER
;
EXEXIT:
POP DS ;RESTORE DATA SEGMENT
POP BP ;RESTORE BASE POINTER
RET 8 ;REMOVE AND RETURN
EXTRACTTOCHAR ENDP
PAGE
;----------------------------------------------------------------------
; TARGET := EXTRACTFORCOUNT(SOURCE,SIZEOF(TARGET),COUNT);
;
; TARGET === THE NAME OF ANY VALID TP4 STRING VARIABLE
; SOURCE === THE NAME OF ANY VALID TP4 STRING VARIABLE
; SIZEOF(X) === THE VALUE RETURN BY SIZEOF FOR TAGET
; COUNT === NUMBER OF CHARACTERS TO EXTRACT
;----------------------------------------------------------------------
; THE EFFECT OF THIS ROUTINE IS AS IF YOU HAD CODED THE FOLLOWING;
;
; STRING := COPY(STRING,1,COUNT);
; DELETE(STRINGT,1,COUNT);
;
; IT IS THE USERS RESPONSIBILITY TO INSURE THAT THE TARGET STRING IS
; LARGE ENOUGH TO CONTAIN THE EXTRACTED STRING.
;---------------------------------------------------------------------
ECTARGET EQU DWORD PTR [BP+14] ;STACK POS OF RESULT PTR
ECSOURCE EQU DWORD PTR [BP+10] ;STACK POS OF SOURCE PTR
ECTRGLEN EQU WORD PTR [BP+8] ;STACK POS OF RESULT LENGTH
ECCOUNT EQU BYTE PTR [BP+6] ;STACK POS OF COUNT
EXTRACTFORCOUNT PROC FAR
PUSH BP ;SAVE BASE POINTER
MOV BP,SP ;SETUP STACK FRAME
PUSH DS ;SAVE DATA SEGMENT POINTER
;
; LOAD ADDR OF TARGET AND SET LENGTH TO ZERO
;
LES DI,ECTARGET ;LOAD ADDR OF TARGET STRING
SUB AL,AL ;CLEAR AL
STOSB ;SET TARGET LENGTH TO ZERO
DEC DI ;BACKUP TO LENGTH BYTE
;
; LOAD ADDR OF SOURCE AND VALIDATE LENGTH AND COUNT
;
ECCHKSRC:
LDS SI,ECSOURCE ;LOAD ADDR OF SOURCE STRING
LODSB ;GET THE SOURCE LENGTH
CMP AL,0 ;Q. IS SOURCE LENGTH ZERO
JE ECEXIT ;A. YES--THEN DO NOTHING
;
; SOURCE_LEN IS NOT ZERO...BUT IS IT => COUNT ?
;
MOV AH,ECCOUNT ;LOAD THE EXTRACT COUNT
CMP AL,AH ;Q. SOURCE_LEN => COUNT
JAE ECSETLEN ;A. YES--ALL IS OKAY
MOV AH,AL ;A. NO--COUNT = SOURCE_LEN
;
; SOURCE_LEN WAS < COUNT...SET COUNT = SOURCE_LEN
;
ECSETLEN:
MOV CL,AH ;MOVE FINAL LENGTH TO CX
SUB CH,CH ;
MOV BX,CX ;SAVE LENGTH OF MOVE
;
; SEE IF TARGET IS LARGE ENOUGH TO HOLD THE EXTRACTED STRING
;
MOV DX,EXTRGLEN ;LOAD MAX SIZE OF TARGET
DEC DX ;ADJUST FOR LENGTH BYTE
CMP DX,CX ;Q. IS TARGET LARGE ENOUGH
JAE ECMOVE ;A. YES--GO DO THE MOVE
MOV BX,DX ;A. NO--TARGET_LEN = MOVE LEN
MOV CX,DX ;MOVE_LEN = TARGET_LEN
;
; TARGET WAS LARGE ENOUGH...SET TARGET_LEN TO EXTRACTED_STRING_LEN
;
ECMOVE:
MOV AL,CL ;MOVE FINAL LENGTH TO AL
STOSB ;SET TARGET LENGTH TO ZERO
;
; NOW WE CAN MOVE THE BYTES FROM SOURCE TO TARGET
;
CLD ;SET DIRECTION TO FORWARD
REP MOVSB ;COPY FROM SOURCE TO TARGET
;
; NOW WE MUST REMOVE THE EXTRACTED CHARACTERS FROM THE SOURCE STRING
;
LES DI,ECSOURCE ;RELOAD ADDR OF SOURCE
LDS SI,ECSOURCE ;AND ONCE MORE FOR MOVE
LODSB ;AL = SOURCE STRING LENGTH
SUB AH,AH ;CLEAR HIGH ORDER BYTE
MOV CX,BX ;RESTORE EXTRACTED LENGTH
;
; NOW COMPUTE THE NEW SOURCE LENGTH AND ADJUST THE SOURCE STRING
;
ADD SI,CX ;OFFSET TO 1ST BYTE NOT MOVED
SUB AX,CX ;NEW_LEN = SRC_LEN - XTRCT_LEN
STOSB ;SET SRC_LEN = NEW_LEN
JZ ECEXIT ;EXIT IF CURR_LEN = 0
MOV CX,AX ;MOVE LENGTH = NEW_LENGTH
CLD ;SET DIRECTION TO FORWARD
REP MOVSB ;LEFT ALIGN REMAINING SOURCE
;
; ALL DONE SO RESTORE THE STUFF WE SAVED AND RETURN TO THE CALLER
;
ECEXIT:
POP DS ;RESTORE DATA SEGMENT
POP BP ;RESTORE BASE POINTER
RET 8 ;REMOVE AND RETURN
EXTRACTFORCOUNT ENDP
PAGE
;----------------------------------------------------------------------
; PADLEFT(STRING,SIZEOF(TARGET),TARGET_LEN,PAD_CHAR);
;
; STRING === THE NAME OF ANY VALID TP4 STRING VARIABLE
; SIZEOF(X) === THE VALUE RETURN BY SIZEOF FOR TAGET
; TARGET_LEN === DESIRED LENGTH AFTER PADDING
; PAD_CHAR === ANY VALID CHARACTER
;----------------------------------------------------------------------
; THE EFFECT OF THIS ROUTINE IS AS IF YOU HAD CODED THE FOLLOWING;
;
; STRING[I] := TRANSLATE_TABLE[ORD(STRING[I])];
;
; IT IS THE USERS RESPONSIBILITY TO INSURE THAT THE TARGET STRING IS
; LARGE ENOUGH TO CONTAIN THE EXTRACTED STRING.
;---------------------------------------------------------------------
PLSTRING EQU DWORD PTR [BP+12] ;STACK POS OF STRING PTR
PLMAXLEN EQU WORD PTR [BP+10] ;STACK POS OF MAX LENGTH
PLTRGLEN EQU WORD PTR [BP+8] ;STACK POS OF DESIRED LENGTH
PLCHAR EQU BYTE PTR [BP+6] ;STACK POS OF PAD CHAR
PADLEFT PROC FAR
PUSH BP ;SAVE BASE POINTER
MOV BP,SP ;SETUP STACK FRAME
PUSH DS ;SAVE DATA SEGMENT POINTER
;
; PICK UP THE VARIOUS PARAMETERS
;
CLD ;DIRECTION = FORWARD
LDS SI,PLSTRING ;LOAD ADDR OF SOURCE STRING
LES DI,PLSTRING ;LOAD STRING PTR AS DESTINATION
MOV BX,PLMAXLEN ;LOAD THE MAXIMUM STRING LEN
MOV CX,PLTRGLEN ;LOAD THE DESIRED LENGTH
MOV AH,PLCHAR ;LOAD THE PAD CHARACTER
;
; SEE IF WHAT THE CALLER WANTS WILL FIT
;
DEC BX ;DECREMENT FOR LENGTH BYTE
LODSB ;LOAD THE CURRENT STRING LENGTH
SUB AH,AH ;CLEAR HIGH ORDER BYTE
CMP AX,BX ;Q. CUR_LEN => MAX_LEN
JAE PLEXIT ;A. YES--THEN JUST QUIT
CMP AX,CX ;Q. CURR_LEN > DESIRED_LEN
JAE PLEXIT ;A. YES--THEN NOTHING TO DO
CMP CX,BX ;Q. DESIRED_LEN > MAX_LEN
JBE PLSIZEOK ;A. NO--LENGTHS ARE OKAY
MOV CX,BX ;A. YES--DESIRED_LEN = MAX_LEN
PLSIZEOK:
SUB CX,AX ;PAD_LEN = DESIRED_LEN - CUR_LEN
MOV BX,CX ;SAVE PAD_LEN IN BX
;
; ALL IS OKAY, SO MOVE THE STRING RIGHT TO MAKE ROOMM FOR LEFT PAD
;
MOV SI,DI ;SI = DI = 1ST BYTE OF STRING
ADD DI,PLTRGLEN ;DI ==> COMPUTED STRING END
ADD SI,AX ;SI ==> LAST STRING DATA BYTE
MOV CX,AX ;MOVE OLD_LEN BYTES
STD ;DIRECTION = BACKWARDS
REP MOVSB ;MOVE STRING RIGHT 'N' BYTES
;
; FILL THE VACANT SPACE ON THE LEFT WILL 'PLCHAR'
;
CLD ;DIRECTION = FORWARD
LES DI,PLSTRING ;LOAD ADDR OF STRING AGAIN
MOV AX,PLTRGLEN ;LOAD LENGTH OF PAD
STOSB ;SET NEW LENGTH OF STRING
MOV AL,PLCHAR ;LOAD THE PAD CHARACTER
MOV CX,BX ;RESTORE PAD_LEN
CLD ;SET DIRECTION TO FORWARD
REP STOSB ;PAD THE STRING
;
; ALL DONE SO RESTORE THE STUFF WE SAVED AND RETURN TO THE CALLER
;
PLEXIT:
POP DS ;RESTORE DATA SEGMENT
POP BP ;RESTORE BASE POINTER
RET 8 ;REMOVE AND RETURN
PADLEFT ENDP
PAGE
;----------------------------------------------------------------------
; PADRIGHT(STRING,SIZEOF(TARGET),TARGET_LEN,PAD_CHAR);
;
; STRING === THE NAME OF ANY VALID TP4 STRING VARIABLE
; SIZEOF(X) === THE VALUE RETURN BY SIZEOF FOR TAGET
; TARGET_LEN === DESIRED LENGTH AFTER PADDING
; PAD_CHAR === ANY VALID CHARACTER
;----------------------------------------------------------------------
; THE EFFECT OF THIS ROUTINE IS AS IF YOU HAD CODED THE FOLLOWING;
;
; FOR I := 1 TO (TARGET_LEN - LENGTH(STRING)) DO
; STRING := STRING + PAD_CHAR;
;
; IT IS THE USERS RESPONSIBILITY TO INSURE THAT THE TARGET STRING IS
; LARGE ENOUGH TO CONTAIN THE EXTRACTED STRING.
;---------------------------------------------------------------------
PRSTRING EQU DWORD PTR [BP+12] ;STACK POS OF STRING PTR
PRMAXLEN EQU WORD PTR [BP+10] ;STACK POS OF MAX LENGTH
PRTRGLEN EQU WORD PTR [BP+8] ;STACK POS OF DESIRED LENGTH
PRCHAR EQU BYTE PTR [BP+6] ;STACK POS OF PAD CHAR
PADRIGHT PROC FAR
PUSH BP ;SAVE BASE POINTER
MOV BP,SP ;SETUP STACK FRAME
PUSH DS ;SAVE DATA SEGMENT POINTER
;PRDEBUG: JMP PRDEBUG
;
; PICK UP THE VARIOUS PARAMETERS
;
CLD ;DIRECTION = FORWARD
LDS SI,PRSTRING ;LOAD ADDR OF SOURCE STRING
LES DI,PRSTRING ;LOAD STRING PTR AS DESTINATION
MOV BX,PRMAXLEN ;LOAD THE MAXIMUM STRING LEN
MOV CX,PRTRGLEN ;LOAD THE DESIRED LENGTH
;
; SEE IF WHAT THE CALLER WANTS WILL FIT
;
DEC BX ;DECREMENT FOR LENGTH BYTE
LODSB ;LOAD THE CURRENT STRING LENGTH
SUB AH,AH ;CLEAR HIGH ORDER BYTE
CMP AX,BX ;Q. CUR_LEN => MAX_LEN
JAE PREXIT ;A. YES--THEN JUST QUIT
CMP AX,CX ;Q. CURR_LEN > DESIRED_LEN
JAE PREXIT ;A. YES--THEN NOTHING TO DO
CMP CX,BX ;Q. DESIRED_LEN > MAX_LEN
JBE PRSIZEOK ;A. NO--LENGTHS ARE OKAY
MOV CX,BX ;A. YES--DESIRED_LEN = MAX_LEN
PRSIZEOK:
SUB CX,AX ;PAD_LEN = DESIRED_LEN - CUR_LEN
MOV BX,CX ;SAVE PAD_LEN IN BX
;
; FILL THE VACANT SPACE ON THE LEFT WILL 'PRCHAR'
;
CLD ;DIRECTION = FORWARD
LES DI,PRSTRING ;LOAD ADDR OF STRING AGAIN
INC DI ;POINT TO 1ST DATA BYTE
ADD DI,AX ;DI ==> 1ST EMPTY BYTE
MOV AL,PRCHAR ;LOAD THE PAD CHARACTER
MOV CX,BX ;RESTORE PAD_LEN
CLD ;SET DIRECTION TO FORWARD
REP STOSB ;PAD THE STRING
;
; NOW SET THE NEW LENGTH OF THE STRING
;
LDS SI,PRSTRING ;LOAD ADDR OF STRING
MOV CL,[SI] ;LOAD CURR_LEN
SUB CH,CH ;CLEAR HIGH BYTE
ADD CX,BX ;NEW_LEN = CURR_LEN + PAD_LEN
MOV [SI],CL ;SET NEW LENGTH OF STRING
;
; ALL DONE SO RESTORE THE STUFF WE SAVED AND RETURN TO THE CALLER
;
PREXIT:
POP DS ;RESTORE DATA SEGMENT
POP BP ;RESTORE BASE POINTER
RET 8 ;REMOVE AND RETURN
PADRIGHT ENDP
CODE ENDS
END